package org.domon.manager.base.mybatis.mapper;

import java.util.List;

import org.apache.ibatis.annotations.DeleteProvider;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import org.apache.ibatis.session.RowBounds;
import org.domon.manager.base.mybatis.MyBatisPojo;
import org.domon.manager.base.mybatis.sql.CRUDTemplate;

/**
 * MyBatis CRUD基接口
 * 
 * @author ALLEN.HU
 * 
 * @param <T>
 *            处理的POJO对象
 */
public interface BaseMapper<T extends MyBatisPojo> {

	/**
	 * 插入，Insert语句从CRUDTemplate类中生成
	 * 
	 * @param obj
	 */
	@InsertProvider(type = CRUDTemplate.class, method = "insert")
	@Options(useGeneratedKeys = true, keyProperty = "id")
	public int insert(T entity);

	/**
	 * 修改，Update语句从CRUDTemplate类中生成
	 * 
	 * @param obj
	 */
	@UpdateProvider(type = CRUDTemplate.class, method = "update")
	public int update(T entity);

	/**
	 * 根据ID修改，Update语句从CRUDTemplate类中生成
	 * 
	 * @param obj
	 */
	@UpdateProvider(type = CRUDTemplate.class, method = "updateById")
	public int updateById(T entity);

	/**
	 * 删除，Delete语句从CRUDTemplate类中生成
	 * 
	 * @param obj
	 */
	@DeleteProvider(type = CRUDTemplate.class, method = "delete")
	public int delete(T entity);

	/**
	 * 根据ID删除，Delete语句从CRUDTemplate类中生成
	 * 
	 * @param entity
	 * @return
	 */
	@DeleteProvider(type = CRUDTemplate.class, method = "deleteById")
	public int deleteById(T entity);

	/**
	 * 查询，Select语句从CRUDTemplate类中生成<br/>
	 * 基于泛型的SELECT的返回类型,无法达到运行时改变对象签名<br/>
	 * 解决方案：需要在每个子mapper中定义返回类型BaseResultMap
	 * 
	 * @return List<T>
	 */
	@ResultMap("BaseResultMap")
	@SelectProvider(type = CRUDTemplate.class, method = "select")
	public List<T> select(T entity);

	/**
	 * 根据ID查询，Select语句从CRUDTemplate类中生成<br/>
	 * 基于泛型的SELECT的返回类型,无法达到运行时改变对象签名<br/>
	 * 解决方案：需要在每个子mapper中定义返回类型BaseResultMap
	 * 
	 * @return T
	 */
	@ResultMap("BaseResultMap")
	@SelectProvider(type = CRUDTemplate.class, method = "selectById")
	public T selectById(T entity);

	/**
	 * 分页查询<br/>
	 * 基于泛型的SELECT的返回类型,无法达到运行时改变对象签名<br/>
	 * 解决方案：需要在每个子mapper中定义返回类型BaseResultMap
	 * 
	 * @return List<T>
	 */
	@ResultMap("BaseResultMap")
	@SelectProvider(type = CRUDTemplate.class, method = "select")
	public List<T> selectOnePage(T entity, RowBounds rowBounds);
}